j=i>0?m++:i<0?n++:k++; 结果如何

来源:百度知道 编辑:UC知道 时间:2024/05/30 03:48:54
#include "stdio.h"
main()
{
int i=1,j,m=0,n=0,k=0;
j=i>0?m++:i<0?n++:k++;
printf("%d\t%d\t%d\n",m,n,k);
}
结果为什么是1,0,0,谁解释一下,头有点晕
好像书上说A?B:C这个运算是右结合性呀,应该先算i<0?n++:k++才对呀

因为i>0成立所以只执行了m++

--

原则上结合方式和求值顺序是两个概念。右结合只是说应该是

a ? (b ? c : d) : e

最先被求值的还是a。

再比如

a = b = c = d 结合关系是a = (b = (c = d)) 这里第一个等号是最顶级得运算符,左右分别是a和b = c = d。正常来讲求值都是从左到右的,也就是先求左边a的值。并不会因为结合关系而先求b = c = d的值。

但是C/C++里这玩意被搞得相当乱。

j=i>0?m++:i<0?n++:k++; 这段代码用常用的代码描述为:
if ( j = i > 0 ) {
m++;
}
else if ( i < 0 ) {
n++;
}
else {
k++;
}
你在开头定义了i = 1;m = 0, n = 0, k = 0,而j只定义了没有赋值所以在第一个选择语句条件j = i > 0是正确的,于是执行了m++,而n,k不变,所以输出是1,0,0
PS:你这个应该是用c++写的吧,建议你去找一些国外的经典c++教材比如:c++程序设计语言(特别版)来看,你的这段代码和标准c++不一致,可读性差,你如果真的想学好c++的话,养成好的代码书写习惯是很重要的

0?n++:k